package cn.wolfcode.wolf2w.listener;


import cn.wolfcode.wolf2w.domain.Strategy;
import cn.wolfcode.wolf2w.redis.service.IStrategyStatisVORedisService;
import cn.wolfcode.wolf2w.redis.vo.StrategyStatisVO;
import cn.wolfcode.wolf2w.service.IStrategyService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * redis数据初始化监听器
 */
//@Component
public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent>{
    //操作mongodb攻略
    @Autowired
    private IStrategyService strategyService;
    //攻略里面vo对象
    @Autowired
    private IStrategyStatisVORedisService strategyStatisVORedisService;

    //当容器器调用refresh() 方法时候马上执行下面逻辑
    //spring容器启动之后, 并初始化完成之后马上执行该方法下面逻辑
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("------------攻略VO对象初始化start--------------------------");
/**
 * 从mongodb数据库搬到redis
 * 1.攻略统计对象
 */



        //查询mongodb 中所有攻略
        //真实开发得加条件
        List<Strategy> sts = strategyService.list();
        //遍历所有攻略将攻略对象转化成vo对象
        for (Strategy st : sts) {
            /**
             *  存在问题：第一次初始化时, 攻略A 点赞数100   ---> vo 点赞数100 redis中统计数据跟数据库不一致
             *     一段时间之后, 假设很多人点赞了,  vo 点赞数 200
             *重启mgrsite项目, 又执行一次初始化的话那么原先攻略A点赞100会覆盖 redis vo的200数据
             *
             * 解决方案:如果redis中已经存在vo对象, 直接跳过不初始化即可.
             */

            //判断vo对象是否已经存在redis中
            if(strategyStatisVORedisService.isStrategyVoExists(st.getId())){
                continue; //跳过本次循环
            }
            StrategyStatisVO vo = new StrategyStatisVO();
            //st是源，vo是目标
            BeanUtils.copyProperties(st, vo);
            vo.setStrategyId(st.getId());
            //将vo对象缓存到redis中
            strategyStatisVORedisService.setStrategyStatisVo(vo);
        }
        System.out.println("------------初始化--vo--end--------------------------");
    }
}
